package framework.google.collection;

import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;

import com.google.common.base.Function;
import com.google.common.collect.MapMaker;

/** 
 * @author guoliang created GoogleColTestMain.java 
 * @since 2010-4-28 下午05:48:55 
 */  
public class GoogleColTestMain {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        /** 
         * softKeys 
         * weakValues 
         * 可以设置key跟value的strong，soft，weak属性。不错不错。 
         * expiration(3, TimeUnit.SECONDS)设置超时时间为3秒 
         *  
         */  
        ConcurrentMap<String, String> testMap = new MapMaker().concurrencyLevel(32).softKeys().weakValues().expiration(  
                3, TimeUnit.SECONDS).makeComputingMap(new Function<String, String>() {  
            /** 
             * 这里就是绑定的根据key没找到value的时候触发的function， 
             * 可以将这里的返回值放到对应的key的value中！ 
             * @param arg0 
             * @return 
             */  
            @Override  
            public String apply(String arg0) {  
                return "create:" + arg0;  
            }  
  
        });  
  
        testMap.put("a", "testa");  
        testMap.put("b", "testb");  
  
        System.out.println(testMap.get("a"));  
        System.out.println(testMap.get("b"));  
        System.out.println(testMap.get("c"));  
  
        /** 
         * 这里sleep4秒钟过后， 
         * 缓存都失效，再get就会根据绑定的function去获得value放在map中了。 
         */  
        try {  
            Thread.sleep(4000);  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
          
        /** 
         * 看看这里的再输出，是不是就是新的值了！~ 
         */  
  
        System.out.println(testMap.get("a"));  
        System.out.println(testMap.get("b"));  
        System.out.println(testMap.get("c"));  
    }  
  
}  
